package study.itwill.team5.member;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import study.itwill.common.DateTime;

/**
 * 나의찜 - 추가, 삭제, 나의찜 회원리스트, 나의찜 민박리스트 기능을 가진 클래스
 */
public class Wishlist {
	
	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(Wishlist.class);
	
	// 데이터베이스 제어 객체에 대한 참조
	DBHandler db = null;
	
	/** 현재시간 데이터 저장을 위한 SQL구문 작성 */
	String datetime = DateTime.getInstance().getNowDateTimeString();
	
	public Wishlist() {
		// DB객체에 대한 참조 연결
		db = DBHandler.getInstance();
	}
	
		
	/**
	 * 나의찜 추가 기능
	 * @param member_seq	- 회원 테이블의 일련번호
	 * @param house_seq		- 민박 테이블의 일련번호
	 * @return boolean		- 추가 성공 - true, 추가 실패 - false
	 */
	public boolean addWishlist(int member_seq, int house_seq) {
		//-----------------------------------------
		// 메서드 시작
		//-----------------------------------------
		logger.debug("=============== method start >> addWishlist");
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		
		boolean result = false;
		
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO wishlist("
	            + "member_seq, house_seq, reg_date"
	            + ") VALUES (%d, %d, '%s');";
		
		result = db.execSql(sql, member_seq, house_seq, datetime);
		
		//-----------------------------------------
		// 결과처리
		//-----------------------------------------
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + member_seq + "번 회원의 나의찜 추가 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 나의찜 추가 실패");
		}
		
		logger.debug("=============== method end >> addWishlist");
		
		
		return result;
	}
	
	/**
	 * 나의찜 삭제 기능
	 * @param member_seq	- 회원 테이블의 일련번호
	 * @param house_seq		- 민박 테이블의 일련번호
	 * @return boolean		- 삭제 성공 - true, 삭제 실패 - false
	 */
	public boolean deleteWishlist(int member_seq, int house_seq) {
		logger.debug("=============== method start >> deleteWishlist");
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		
		boolean result = false;
		
		db.beginTrans();
		
		String sql = "DELETE FROM wishlist WHERE member_seq = %d AND house_seq = %d;";
		result = db.execSql(sql, member_seq, house_seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + member_seq + "번 회원의 나의찜 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 나의찜 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteWishlist");
		
		return result;
	}
	
	/**
	 * 나의찜 리스트 조회
	 * @param choice : 검색조건 (0:나의찜 전체, 1:회원 일련번호로 검색, 2:민박 일련번호 검색)
	 * @param search : 검색값
	 * @return ArrayList<WishlistItem> - 나의찜 목록을 객체배열 형태로 리턴 
	 */
	public ArrayList<WishlistItem> listWishlist(int choice, int search) {
		logger.debug("=============== method start >> listWishlist");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<WishlistItem> list = null;
		
		String sql = null;
		
		ResultSet rs = null;
		
		/*
		 *  나의찜 검색을 위한 파라미터 정의
		 *  0, 0 : 나의찜 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, 회원 일련번호
		 *  2, 민박 일련번호
		 */
		switch(choice) {
		case 0:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq ORDER BY wishlist.reg_date DESC";
			rs = db.getResult(sql);
			break;
			
		case 1:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE member_seq = %d ORDER BY wishlist.reg_date DESC;";
			rs = db.getResult(sql, search);
			break;
		
		case 2:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE house_seq = %d ORDER BY wishlist.reg_date DESC;";
			rs = db.getResult(sql, search);
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE member_seq = -1 ORDER BY wishlist.reg_date DESC;";
			break;
		}
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<WishlistItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int member_seq = rs.getInt(1);
					String user_name = rs.getString(2);
					int house_seq = rs.getInt(3);
					String name = rs.getString(4);
					String reg_date = rs.getString(5);
					
					// 2) 추출된 값을 객체로 구성
					WishlistItem item = new WishlistItem(member_seq, user_name, house_seq, name, reg_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listWishlist");
		
		return list;
	}
	
	/**
	 * 나의찜 리스트 조회
	 * @param choice : 검색조건 (0:나의찜 전체, 1:회원 일련번호로 검색, 2:민박 일련번호 검색)
	 * @param search : 검색값
	 * @return ArrayList<WishlistItem> - 나의찜 목록을 객체배열 형태로 리턴 
	 */
	public ArrayList<WishlistItem> listWishlist(int choice, int search, int start, int end) {
		logger.debug("=============== method start >> listWishlist");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		logger.debug("[PARAMS] start=" + start);
		logger.debug("[PARAMS] end=" + end);
		
		ArrayList<WishlistItem> list = null;
		
		String sql = null;
		
		ResultSet rs = null;
		
		/*
		 *  나의찜 검색을 위한 파라미터 정의
		 *  0, 0 : 나의찜 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, 회원 일련번호
		 *  2, 민박 일련번호
		 */
		switch(choice) {
		case 0:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq ORDER BY wishlist.reg_date DESC LIMIT %d, %d";
			rs = db.getResult(sql, start, end);
			break;
			
		case 1:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE member_seq = %d ORDER BY wishlist.reg_date DESC LIMIT %d, %d;";
			rs = db.getResult(sql, search, start, end);
			break;
		
		case 2:
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE house_seq = %d ORDER BY wishlist.reg_date DESC LIMIT %d, %d;";
			rs = db.getResult(sql, search, start, end);
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT member_seq, user_name, house_seq, name, wishlist.reg_date "
					+ "FROM wishlist INNER JOIN member ON member_seq = member.seq "
					+ "INNER JOIN house ON house_seq = house.seq "
					+ "WHERE member_seq = -1 ORDER BY wishlist.reg_date DESC LIMIT %d, %d;";
			break;
		}
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<WishlistItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int member_seq = rs.getInt(1);
					String user_name = rs.getString(2);
					int house_seq = rs.getInt(3);
					String name = rs.getString(4);
					String reg_date = rs.getString(5);
					
					// 2) 추출된 값을 객체로 구성
					WishlistItem item = new WishlistItem(member_seq, user_name, house_seq, name, reg_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listWishlist");
		
		return list;
	}
	
	/**
	 * 나의찜 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @return ArrayList<WishlistItem>	- 0과 0을 오버로딩된 메서드로 반환
	 */
	public ArrayList<WishlistItem> listWishlist(int choice) {
		return listWishlist(choice, 0);
	}
	
	/**
	 * 나의찜 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @param start - 검색 범위의 시작위치
	 * @param end - 한 페이지에 보여질 글의 목록 수
	 * @return ArrayList<WishlistItem>	- 0과 0을 오버로딩된 메서드로 반환
	 */
	public ArrayList<WishlistItem> listWishlist(int choice, int start, int end) {
		return listWishlist(choice, 0, start, end);
	}
	
}
